// 2_6_testleetcode.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<string>
using namespace std;


//回文数
class Solution {
public:
    bool isLetterOrNumber(char ch)
    {
        return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
    }

    bool isPalindrome(string s) {
        // 先小写字母转换成大写，再进行判断
        for (auto& ch : s)
        {
            if (ch >= 'a' && ch <= 'z')
                ch -= 32;
        }
        int begin = 0, end = s.size() - 1;
        while (begin < end)
        {
            while (begin < end && !isLetterOrNumber(s[begin]))
                ++begin;

            while (begin < end && !isLetterOrNumber(s[end]))
                --end;

            if (s[begin] != s[end])
            {
                return false;
            }
            else
            {

                ++begin;
                --end;
            }
        }

        return true;
    }
};

//541. 反转字符串 II
class Solution2 {
public:
    string reverseStr(string s, int k) {
        int end = s.size();
        int k1 = 0;
        int k2 = 0;
        int pos = 0;  //越界前，k的位置 
        for (size_t i = 0; i < end; i++)
        {
            k1 = i * 2 * k;
            k2 = k1 + k - 1;
            if (k2 > end || k > end)
            {
                pos = k1;
                break;
            }
            while (k1 < k2 && k2 < end)
            {
                swap(s[k1], s[k2]);
                k1++;
                k2--;
            }

        }
        //对剩下的字符串进行反转
        int end1 = end - 1;
        if ((end1 - pos) < k)
        {
            while (pos < end1)
            {
                swap(s[pos], s[end1]);
                pos++;
                end1--;
            }
        }

        return s;
    }
};


//557. 反转字符串中的单词 III
class Solution {
public:
    string reverseWords(string s) {
        int i = 0;
        size_t pos = s.find(' ');
        while (pos != string::npos)
        {
            int flag_pos = pos;
            while (i < (pos - 1))
            {
                swap(s[i], s[pos - 1]);
                i++;
                pos--;
            }
            i = flag_pos + 1;
            pos = s.find(' ', i);
        }
        //出来之后，最后一个单词没有被反转
        int end = s.size() - 1;
        while (i < end)
        {
            swap(s[i], s[end]);
            i++;
            end--;
        }
        return s;
    }
};


